Micron Document
<!DOCTYPE html>
<html class="client-nojs vector-feature-night-mode-disabled vector-feature-language-in-header-enabled vector-feature-language-in-main-page-header-disabled vector-feature-page-tools-pinned-disabled vector-feature-toc-pinned-clientpref-1 vector-feature-main-menu-pinned-disabled vector-feature-limited-width-clientpref-1 vector-feature-limited-width-content-enabled vector-feature-custom-font-size-clientpref-1 vector-feature-appearance-pinned-clientpref-1 vector-sticky-header-enabled" lang="en" dir="ltr"><head>
<meta charset="UTF-8">
<title>Overlap–save method</title>
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="canonical" href="https://en.wikipedia.org/wiki/Overlap%E2%80%93save_method"> <link href="./mw/ext.cite.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/ext.math.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.icons.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.search.codex.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/skins.vector.styles.css" rel="stylesheet" type="text/css">
<link href="./mw/user.styles.css" rel="stylesheet" type="text/css">
<meta name="ResourceLoaderDynamicStyles" content="">
<link rel="stylesheet" type="text/css" href="./mw/site.styles.css">
<link rel="stylesheet" type="text/css" href="./mw/noscript.css">
<link rel="stylesheet" type="text/css" href="./footer.css">
<link rel="stylesheet" type="text/css" href="./vector-2022.css">
</head>
<body class="skin--responsive skin-vector skin-vector-search-vue mediawiki ltr sitedir-ltr mw-hide-empty-elt ns-0 ns-subject page-Overlap–save_method rootpage-Overlap–save_method skin-vector-2022 action-view">
<div class="mw-page-container">
<div class="mw-page-container-inner">
<div class="mw-content-container">
<main id="content" class="mw-body">
<header class="mw-body-header vector-page-titlebar">
<h1 id="firstHeading" class="firstHeading mw-first-heading">
<span id="openzim-page-title" class="mw-page-title-main"><span class="mw-page-title-main">Overlap–save method</span></span>
</h1>
</header>
<a id="top"></a>
<div id="bodyContent" class="vector-body ve-init-mw-desktopArticleTarget-targetContainer" aria-labelledby="firstHeading" data-mw-ve-target-container="">
<div id="mw-content-text" class="mw-body-content mw-content-ltr" lang="en" dir="ltr"><div class="mw-content-ltr mw-parser-output" lang="en" dir="ltr"><p>In <a href="Signal_processing" title="Signal processing">signal processing</a>, <i><b>overlap–save</b></i> is the traditional name for an efficient way to evaluate the <a href="Convolution#Discrete_convolution" title="Convolution">discrete convolution</a> between a very long signal <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle x[n]}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>x</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle x[n]}</annotation>
</semantics>
</math></span><img src="./864cbbefbdcb55af4d9390911de1bf70167c4a3d.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:4.018ex; height:2.843ex;" alt="{\displaystyle x[n]}" loading="lazy"></span> and a <a href="Finite_impulse_response" title="Finite impulse response">finite impulse response</a> (FIR) filter <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle h[n]}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle h[n]}</annotation>
</semantics>
</math></span><img src="./89981bbbb05ffd469eeadb828c18359965985e46.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:4.027ex; height:2.843ex;" alt="{\displaystyle h[n]}" loading="lazy"></span><b>:</b>
</p>
<div class="equation-box" style="margin: ;padding: 0px; border-width:0px; border-style: solid; border-color: var(--color-success,#14866d); color: inherit;text-align: center; display: table">
<style data-mw-deduplicate="TemplateStyles:r1266403038">
/* start https://en.wikipedia.org/ */


.mw-parser-output table.numblk{border-collapse:collapse;border:none;margin-top:0;margin-right:0;margin-bottom:0}.mw-parser-output table.numblk>tbody>tr>td{vertical-align:middle;padding:0}.mw-parser-output table.numblk>tbody>tr>td:nth-child(2){width:99%}.mw-parser-output table.numblk>tbody>tr>td:nth-child(2)>table{border-collapse:collapse;margin:0;border:none;width:100%}.mw-parser-output table.numblk>tbody>tr>td:nth-child(2)>table>tbody>tr:first-child>td:first-child,.mw-parser-output table.numblk>tbody>tr>td:nth-child(2)>table>tbody>tr:first-child>td:last-child{padding:0 0.4ex}.mw-parser-output table.numblk>tbody>tr>td:nth-child(2)>table>tbody>tr:first-child>td:nth-child(2){width:100%;padding:0}.mw-parser-output table.numblk>tbody>tr>td:nth-child(2)>table>tbody>tr:last-child>td{padding:0}.mw-parser-output table.numblk>tbody>tr>td:last-child{font-weight:bold}.mw-parser-output table.numblk.numblk-raw-n>tbody>tr>td:last-child{font-weight:unset}.mw-parser-output table.numblk>tbody>tr>td:last-child::before{content:"("}.mw-parser-output table.numblk>tbody>tr>td:last-child::after{content:")"}.mw-parser-output table.numblk.numblk-raw-n>tbody>tr>td:last-child::before,.mw-parser-output table.numblk.numblk-raw-n>tbody>tr>td:last-child::after{content:none}.mw-parser-output table.numblk>tbody>tr>td{border:none}.mw-parser-output table.numblk.numblk-border>tbody>tr>td{border:thin solid}.mw-parser-output table.numblk>tbody>tr>td:nth-child(2)>table>tbody>tr:first-child>td{border:none}.mw-parser-output table.numblk.numblk-border>tbody>tr>td:nth-child(2)>table>tbody>tr:first-child>td{border:thin solid}.mw-parser-output table.numblk>tbody>tr>td:nth-child(2)>table>tbody>tr:last-child>td{border-left:none;border-right:none;border-bottom:none}.mw-parser-output table.numblk.numblk-border>tbody>tr>td:nth-child(2)>table>tbody>tr:last-child>td{border-left:thin solid;border-right:thin solid;border-bottom:thin solid}.mw-parser-output table.numblk:target{color:var(--color-base,#202122);background-color:#cfe8fd}@media screen{html.skin-theme-clientpref-night .mw-parser-output table.numblk:target{color:var(--color-base,#eaecf0);background-color:#301702}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output table.numblk:target{color:var(--color-base,#eaecf0);background-color:#301702}}


/* end https://en.wikipedia.org/ */
</style><table role="presentation" class="numblk" style="margin-left: 1.6em;"><tbody><tr><td class="nowrap"><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle y[n]=x[n]*h[n]\ \triangleq \ \sum _{m=-\infty }^{\infty }h[m]\cdot x[n-m]=\sum _{m=1}^{M}h[m]\cdot x[n-m],}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>y</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<mi>x</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>∗<!-- ∗ --></mo>
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mtext>&nbsp;</mtext>
<mo>≜<!-- ≜ --></mo>
<mtext>&nbsp;</mtext>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</munderover>
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>m</mi>
<mo stretchy="false">]</mo>
<mo>⋅<!-- ⋅ --></mo>
<mi>x</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>M</mi>
</mrow>
</munderover>
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>m</mi>
<mo stretchy="false">]</mo>
<mo>⋅<!-- ⋅ --></mo>
<mi>x</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">]</mo>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle y[n]=x[n]*h[n]\ \triangleq \ \sum _{m=-\infty }^{\infty }h[m]\cdot x[n-m]=\sum _{m=1}^{M}h[m]\cdot x[n-m],}</annotation>
</semantics>
</math></span><img src="./6c695304cee4b4c978397073ba487fb5b5f97686.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.005ex; width:66.037ex; height:7.343ex;" alt="{\displaystyle y[n]=x[n]*h[n]\ \triangleq \ \sum _{m=-\infty }^{\infty }h[m]\cdot x[n-m]=\sum _{m=1}^{M}h[m]\cdot x[n-m],}" loading="lazy"></span> &nbsp; &nbsp;
</td> <td></td> <td class="nowrap"><span id="math_Eq.1" class="reference nourlexpansion" style="font-weight:bold;">Eq.1</span></td></tr></tbody></table>
</div>
<p>where <span class="nowrap"><i>h</i>[<i>m</i>] = 0</span> for <i>m</i> outside the region <span class="nowrap">[1, <i>M</i>]</span>.
This article uses common abstract notations, such as <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\textstyle y(t)=x(t)*h(t),}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="false" scriptlevel="0">
<mi>y</mi>
<mo stretchy="false">(</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>∗<!-- ∗ --></mo>
<mi>h</mi>
<mo stretchy="false">(</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\textstyle y(t)=x(t)*h(t),}</annotation>
</semantics>
</math></span><img src="./a1a31c01ec86e6295c78878fadee5277058e561f.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:17.711ex; height:2.843ex;" alt="{\textstyle y(t)=x(t)*h(t),}" loading="lazy"></span> or <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\textstyle y(t)={\mathcal {H}}\{x(t)\},}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="false" scriptlevel="0">
<mi>y</mi>
<mo stretchy="false">(</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mi class="MJX-tex-caligraphic" mathvariant="script">H</mi>
</mrow>
</mrow>
<mo fence="false" stretchy="false">{</mo>
<mi>x</mi>
<mo stretchy="false">(</mo>
<mi>t</mi>
<mo stretchy="false">)</mo>
<mo fence="false" stretchy="false">}</mo>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\textstyle y(t)={\mathcal {H}}\{x(t)\},}</annotation>
</semantics>
</math></span><img src="./82b2eac7eb622278e2fae3321f6b622bd8593ec5.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:15.817ex; height:2.843ex;" alt="{\textstyle y(t)={\mathcal {H}}\{x(t)\},}" loading="lazy"></span> in which it is understood that the functions should be thought of in their totality, rather than at specific instants <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\textstyle t}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="false" scriptlevel="0">
<mi>t</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\textstyle t}</annotation>
</semantics>
</math></span><img src="./b2bc926f90178739fccd01a96c6fa778ab3535d6.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:0.84ex; height:2.009ex;" alt="{\textstyle t}" loading="lazy"></span> (see <a href="Convolution#Notation" title="Convolution">Convolution#Notation</a>).
</p>

<p>The concept is to compute short segments of <i>y</i>[<i>n</i>] of an arbitrary length <i>L</i>, and concatenate the segments together. That requires longer input segments that overlap the next input segment. The overlapped data gets "saved" and used a second time.<sup id="cite_ref-OLA_2-0" class="reference"><a href="#cite_note-OLA-2"><span class="cite-bracket">[</span>1<span class="cite-bracket">]</span></a></sup> First we describe that process with just conventional convolution for each output segment. Then we describe how to replace that convolution with a more efficient method.
</p><p>Consider a segment that begins at <i>n</i> = <i>kL</i>&nbsp;+&nbsp;<i>M</i>, for any integer <i>k</i>, and define<b>:</b>
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle x_{k}[n]\ \triangleq {\begin{cases}x[n+kL],&amp;1\leq n\leq L+M-1\\0,&amp;{\textrm {otherwise}}.\end{cases}}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mtext>&nbsp;</mtext>
<mo>≜<!-- ≜ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mrow>
<mo>{</mo>
<mtable columnalign="left left" rowspacing=".2em" columnspacing="1em" displaystyle="false">
<mtr>
<mtd>
<mi>x</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>+</mo>
<mi>k</mi>
<mi>L</mi>
<mo stretchy="false">]</mo>
<mo>,</mo>
</mtd>
<mtd>
<mn>1</mn>
<mo>≤<!-- ≤ --></mo>
<mi>n</mi>
<mo>≤<!-- ≤ --></mo>
<mi>L</mi>
<mo>+</mo>
<mi>M</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
</mtd>
</mtr>
<mtr>
<mtd>
<mn>0</mn>
<mo>,</mo>
</mtd>
<mtd>
<mrow class="MJX-TeXAtom-ORD">
<mrow class="MJX-TeXAtom-ORD">
<mtext>otherwise</mtext>
</mrow>
</mrow>
<mo>.</mo>
</mtd>
</mtr>
</mtable>
<mo fence="true" stretchy="true" symmetric="true"></mo>
</mrow>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle x_{k}[n]\ \triangleq {\begin{cases}x[n+kL],&amp;1\leq n\leq L+M-1\\0,&amp;{\textrm {otherwise}}.\end{cases}}}</annotation>
</semantics>
</math></span><img src="./86d96799af4ad7297c6e47260666c2a4e4ef20a3.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.505ex; width:43.525ex; height:6.176ex;" alt="{\displaystyle x_{k}[n]\ \triangleq {\begin{cases}x[n+kL],&amp;1\leq n\leq L+M-1\\0,&amp;{\textrm {otherwise}}.\end{cases}}}" loading="lazy"></span></dd></dl>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle y_{k}[n]\ \triangleq \ x_{k}[n]*h[n]=\sum _{m=1}^{M}h[m]\cdot x_{k}[n-m].}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>y</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mtext>&nbsp;</mtext>
<mo>≜<!-- ≜ --></mo>
<mtext>&nbsp;</mtext>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>∗<!-- ∗ --></mo>
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>M</mi>
</mrow>
</munderover>
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>m</mi>
<mo stretchy="false">]</mo>
<mo>⋅<!-- ⋅ --></mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">]</mo>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle y_{k}[n]\ \triangleq \ x_{k}[n]*h[n]=\sum _{m=1}^{M}h[m]\cdot x_{k}[n-m].}</annotation>
</semantics>
</math></span><img src="./8fd9d2fd0bbbfdd29588f4269fa83eb6a5c6bb78.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.005ex; width:44.52ex; height:7.343ex;" alt="{\displaystyle y_{k}[n]\ \triangleq \ x_{k}[n]*h[n]=\sum _{m=1}^{M}h[m]\cdot x_{k}[n-m].}" loading="lazy"></span></dd></dl>
<p>Then, for <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle kL+M+1\leq n\leq kL+L+M}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>k</mi>
<mi>L</mi>
<mo>+</mo>
<mi>M</mi>
<mo>+</mo>
<mn>1</mn>
<mo>≤<!-- ≤ --></mo>
<mi>n</mi>
<mo>≤<!-- ≤ --></mo>
<mi>k</mi>
<mi>L</mi>
<mo>+</mo>
<mi>L</mi>
<mo>+</mo>
<mi>M</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle kL+M+1\leq n\leq kL+L+M}</annotation>
</semantics>
</math></span><img src="./5a09aa10ec5f44fdf137ffcd9b106c36b7b1c9b5.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.505ex; width:32.171ex; height:2.343ex;" alt="{\displaystyle kL+M+1\leq n\leq kL+L+M}" loading="lazy"></span>, and equivalently <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M+1\leq n-kL\leq L+M}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>M</mi>
<mo>+</mo>
<mn>1</mn>
<mo>≤<!-- ≤ --></mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>k</mi>
<mi>L</mi>
<mo>≤<!-- ≤ --></mo>
<mi>L</mi>
<mo>+</mo>
<mi>M</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M+1\leq n-kL\leq L+M}</annotation>
</semantics>
</math></span><img src="./e61429620e46a607aaf33d1dd4dd39295d30c199.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.505ex; width:26.537ex; height:2.343ex;" alt="{\displaystyle M+1\leq n-kL\leq L+M}" loading="lazy"></span>, we can write:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle y[n]=\sum _{m=1}^{M}h[m]\cdot x_{k}[n-kL-m]\ \ \triangleq \ \ y_{k}[n-kL].}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>y</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo>=</mo>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>m</mi>
<mo>=</mo>
<mn>1</mn>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>M</mi>
</mrow>
</munderover>
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>m</mi>
<mo stretchy="false">]</mo>
<mo>⋅<!-- ⋅ --></mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>k</mi>
<mi>L</mi>
<mo>−<!-- − --></mo>
<mi>m</mi>
<mo stretchy="false">]</mo>
<mtext>&nbsp;</mtext>
<mtext>&nbsp;</mtext>
<mo>≜<!-- ≜ --></mo>
<mtext>&nbsp;</mtext>
<mtext>&nbsp;</mtext>
<msub>
<mi>y</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>k</mi>
<mi>L</mi>
<mo stretchy="false">]</mo>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle y[n]=\sum _{m=1}^{M}h[m]\cdot x_{k}[n-kL-m]\ \ \triangleq \ \ y_{k}[n-kL].}</annotation>
</semantics>
</math></span><img src="./a7c079ad24edca1c7175376f25063e1a0b6e3c26.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.005ex; width:49.466ex; height:7.343ex;" alt="{\displaystyle y[n]=\sum _{m=1}^{M}h[m]\cdot x_{k}[n-kL-m]\ \ \triangleq \ \ y_{k}[n-kL].}" loading="lazy"></span></dd></dl>
<p>With the substitution <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle j=n-kL}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>j</mi>
<mo>=</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>k</mi>
<mi>L</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle j=n-kL}</annotation>
</semantics>
</math></span><img src="./96c03540f0adca4d92f1d1461b761e9ca2c3da01.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; margin-left: -0.027ex; width:11.112ex; height:2.509ex;" alt="{\displaystyle j=n-kL}" loading="lazy"></span>, the task is reduced to computing <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle y_{k}[j]}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>y</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>j</mi>
<mo stretchy="false">]</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle y_{k}[j]}</annotation>
</semantics>
</math></span><img src="./594a6b04e674505684013555e4e89ff0bcfe02ae.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:4.48ex; height:2.843ex;" alt="{\displaystyle y_{k}[j]}" loading="lazy"></span> for <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M+1\leq j\leq L+M}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>M</mi>
<mo>+</mo>
<mn>1</mn>
<mo>≤<!-- ≤ --></mo>
<mi>j</mi>
<mo>≤<!-- ≤ --></mo>
<mi>L</mi>
<mo>+</mo>
<mi>M</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M+1\leq j\leq L+M}</annotation>
</semantics>
</math></span><img src="./07a7f315f14c7fbf93f87c29ff44d2e19f289438.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:20.465ex; height:2.509ex;" alt="{\displaystyle M+1\leq j\leq L+M}" loading="lazy"></span>. These steps are illustrated in the first 3 traces of Figure 1, except that the desired portion of the output (third trace) corresponds to <i><b>1</b></i> &nbsp;≤&nbsp; <span class="texhtml mvar" style="font-style:italic;">j</span> &nbsp;≤&nbsp; <b><i>L</i>.<sup id="cite_ref-3" class="reference"><a href="#cite_note-3"><span class="cite-bracket">[</span>B<span class="cite-bracket">]</span></a></sup></b>
</p><p>If we periodically extend <i>x</i><sub><i>k</i></sub>[<i>n</i>] with period <i>N</i> &nbsp;≥&nbsp; <i>L</i>&nbsp;+&nbsp;<i>M</i>&nbsp;−&nbsp;1, according to<b>:</b>
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle x_{k,N}[n]\ \triangleq \ \sum _{\ell =-\infty }^{\infty }x_{k}[n-\ell N],}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
<mo>,</mo>
<mi>N</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mtext>&nbsp;</mtext>
<mo>≜<!-- ≜ --></mo>
<mtext>&nbsp;</mtext>
<munderover>
<mo>∑<!-- ∑ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mi>ℓ<!-- ℓ --></mi>
<mo>=</mo>
<mo>−<!-- − --></mo>
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi mathvariant="normal">∞<!-- ∞ --></mi>
</mrow>
</munderover>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>−<!-- − --></mo>
<mi>ℓ<!-- ℓ --></mi>
<mi>N</mi>
<mo stretchy="false">]</mo>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle x_{k,N}[n]\ \triangleq \ \sum _{\ell =-\infty }^{\infty }x_{k}[n-\ell N],}</annotation>
</semantics>
</math></span><img src="./5d47dd2d227e66f4bfcefd7e64a245876fb0f04e.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -3.171ex; width:28.571ex; height:7.009ex;" alt="{\displaystyle x_{k,N}[n]\ \triangleq \ \sum _{\ell =-\infty }^{\infty }x_{k}[n-\ell N],}" loading="lazy"></span></dd></dl>
<p>the convolutions &nbsp;<span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle (x_{k,N})*h\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
<mo>,</mo>
<mi>N</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo>∗<!-- ∗ --></mo>
<mi>h</mi>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle (x_{k,N})*h\,}</annotation>
</semantics>
</math></span><img src="./729da9273bdd899edd8d3e36412efea7267a26ec.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -1.005ex; width:10.065ex; height:3.009ex;" alt="{\displaystyle (x_{k,N})*h\,}" loading="lazy"></span>&nbsp; and &nbsp;<span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle x_{k}*h\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo>∗<!-- ∗ --></mo>
<mi>h</mi>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle x_{k}*h\,}</annotation>
</semantics>
</math></span><img src="./3c581b90cc2708e3b96254401f12c54873570eeb.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:6.339ex; height:2.509ex;" alt="{\displaystyle x_{k}*h\,}" loading="lazy"></span>&nbsp; are equivalent in the region <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M+1\leq n\leq L+M}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>M</mi>
<mo>+</mo>
<mn>1</mn>
<mo>≤<!-- ≤ --></mo>
<mi>n</mi>
<mo>≤<!-- ≤ --></mo>
<mi>L</mi>
<mo>+</mo>
<mi>M</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M+1\leq n\leq L+M}</annotation>
</semantics>
</math></span><img src="./a10053d84e43c53dd95c81d9d6b173e22e453de8.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.505ex; width:20.902ex; height:2.343ex;" alt="{\displaystyle M+1\leq n\leq L+M}" loading="lazy"></span>. It is therefore sufficient to compute the <b>N</b>-point <a href="Circular_convolution" title="Circular convolution">circular (or cyclic) convolution</a> of <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle x_{k}[n]\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle x_{k}[n]\,}</annotation>
</semantics>
</math></span><img src="./dc9d9200977fc896075d42002a94bfb133d0dd0a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:5.494ex; height:2.843ex;" alt="{\displaystyle x_{k}[n]\,}" loading="lazy"></span> with <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle h[n]\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle h[n]\,}</annotation>
</semantics>
</math></span><img src="./657f337326ef0221b43c4ae709e54fe608a6a527.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:4.414ex; height:2.843ex;" alt="{\displaystyle h[n]\,}" loading="lazy"></span>&nbsp; in the region [1,&nbsp;<i>N</i>]. &nbsp;The subregion [<i>M</i>&nbsp;+&nbsp;1,&nbsp;<i>L</i>&nbsp;+&nbsp;<i>M</i>] is appended to the output stream, and the other values are <u>discarded</u>.&nbsp; The advantage is that the circular convolution can be computed more efficiently than linear convolution, according to the <a href="Discrete_Fourier_transform#Circular_convolution_theorem_and_cross-correlation_theorem" title="Discrete Fourier transform">circular convolution theorem</a><b>:</b>
</p>
<div class="equation-box" style="margin: ;padding: 0px; border-width:0px; border-style: solid; border-color: var(--color-success,#14866d); color: inherit;text-align: center; display: table">
<table role="presentation" class="numblk" style="margin-left: 1.6em;"><tbody><tr><td class="nowrap"><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle y_{k}[n]\ =\ \scriptstyle {\text{IDFT}}_{N}\displaystyle (\ \scriptstyle {\text{DFT}}_{N}\displaystyle (x_{k}[n])\cdot \ \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n])\ ),}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>y</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mtext>&nbsp;</mtext>
<mo>=</mo>
<mtext>&nbsp;</mtext>
<mstyle displaystyle="false" scriptlevel="1">
<msub>
<mrow class="MJX-TeXAtom-ORD">
<mtext>IDFT</mtext>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<mtext>&nbsp;</mtext>
<mstyle displaystyle="false" scriptlevel="1">
<msub>
<mrow class="MJX-TeXAtom-ORD">
<mtext>DFT</mtext>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<msub>
<mi>x</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>k</mi>
</mrow>
</msub>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo stretchy="false">)</mo>
<mo>⋅<!-- ⋅ --></mo>
<mtext>&nbsp;</mtext>
<mstyle displaystyle="false" scriptlevel="1">
<msub>
<mrow class="MJX-TeXAtom-ORD">
<mtext>DFT</mtext>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo stretchy="false">)</mo>
<mtext>&nbsp;</mtext>
<mo stretchy="false">)</mo>
<mo>,</mo>
</mstyle>
</mstyle>
</mstyle>
</mstyle>
</mstyle>
</mstyle>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle y_{k}[n]\ =\ \scriptstyle {\text{IDFT}}_{N}\displaystyle (\ \scriptstyle {\text{DFT}}_{N}\displaystyle (x_{k}[n])\cdot \ \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n])\ ),}</annotation>
</semantics>
</math></span><img src="./ee068be99a264a0051a5a36497df695897bebf42.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:42.993ex; height:2.843ex;" alt="{\displaystyle y_{k}[n]\ =\ \scriptstyle {\text{IDFT}}_{N}\displaystyle (\ \scriptstyle {\text{DFT}}_{N}\displaystyle (x_{k}[n])\cdot \ \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n])\ ),}" loading="lazy"></span> &nbsp; &nbsp;
</td> <td></td> <td class="nowrap"><span id="math_Eq.2" class="reference nourlexpansion" style="font-weight:bold;">Eq.2</span></td></tr></tbody></table>
</div>
<p>where<b>:</b>
</p>
<ul><li>DFT<sub>N</sub> and IDFT<sub>N</sub> refer to the <a href="Discrete_Fourier_transform" title="Discrete Fourier transform">Discrete Fourier transform</a> and its inverse, evaluated over <i>N</i> discrete points, and</li>
<li><span class="texhtml">L</span> is customarily chosen such that <span class="texhtml">N = L+M-1</span> is an integer power-of-2, and the transforms are implemented with the <a href="Fast_Fourier_transform" title="Fast Fourier transform">FFT</a> algorithm, for efficiency.</li>
<li>The leading and trailing edge-effects of circular convolution are overlapped and added,<sup id="cite_ref-4" class="reference"><a href="#cite_note-4"><span class="cite-bracket">[</span>C<span class="cite-bracket">]</span></a></sup> and subsequently discarded.<sup id="cite_ref-5" class="reference"><a href="#cite_note-5"><span class="cite-bracket">[</span>D<span class="cite-bracket">]</span></a></sup></li></ul>
<meta property="mw:PageProp/toc">
<div class="mw-heading mw-heading2"><h2 id="Pseudocode">Pseudocode</h2></div>
<pre><span style="color:green;">(<i>Overlap-save algorithm for linear convolution</i>)</span>
h = FIR_impulse_response
M = length(h)
overlap = M − 1
N = 8 × overlap <span style="color:green;">(see next section for a better choice)</span>
step_size = N − overlap
H = DFT(h, N)
position = 0

<b>while</b> position + N ≤ length(x)
yt = IDFT(DFT(x(position+(1:N))) × H)
y(position+(1:step_size)) = yt(M&nbsp;: N) <span style="color:green;">(discard M−1 y-values)</span>
position = position + step_size
<b>end</b>
</pre>
<div class="mw-heading mw-heading2"><h2 id="Efficiency_considerations">Efficiency considerations</h2></div>

<p>When the DFT and IDFT are implemented by the FFT algorithm, the pseudocode above requires about <span class="nowrap"><b>N (log<sub>2</sub>(N) + 1)</b></span> complex multiplications for the FFT, product of arrays, and IFFT.<sup id="cite_ref-6" class="reference"><a href="#cite_note-6"><span class="cite-bracket">[</span>E<span class="cite-bracket">]</span></a></sup> Each iteration produces <span class="nowrap"><b>N-M+1</b></span> output samples, so the number of complex multiplications per output sample is about<b>:</b>
</p>
<div class="equation-box" style="margin: ;padding: 0px; border-width:0px; border-style: solid; border-color: var(--color-success,#14866d); color: inherit;text-align: center; display: table">
<table role="presentation" class="numblk" style="margin-left: 1.6em;"><tbody><tr><td class="nowrap"><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle {\frac {N(\log _{2}(N)+1)}{N-M+1}}.\,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mrow>
<mi>N</mi>
<mo stretchy="false">(</mo>
<msub>
<mi>log</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<mi>N</mi>
<mo stretchy="false">)</mo>
<mo>+</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
</mrow>
<mrow>
<mi>N</mi>
<mo>−<!-- − --></mo>
<mi>M</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
</mfrac>
</mrow>
<mo>.</mo>
<mspace width="thinmathspace"></mspace>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle {\frac {N(\log _{2}(N)+1)}{N-M+1}}.\,}</annotation>
</semantics>
</math></span><img src="./ffa1e74e4c1fe39a81cd381714644348397e608a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.005ex; width:17.645ex; height:5.843ex;" alt="{\displaystyle {\frac {N(\log _{2}(N)+1)}{N-M+1}}.\,}" loading="lazy"></span> &nbsp; &nbsp;
</td> <td></td> <td class="nowrap"><span id="math_Eq.3" class="reference nourlexpansion" style="font-weight:bold;">Eq.3</span></td></tr></tbody></table>
</div>
<p>For example, when <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M=201}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>M</mi>
<mo>=</mo>
<mn>201</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M=201}</annotation>
</semantics>
</math></span><img src="./4504268e9ece838cb5adba7972e7abf534b27aed.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:9.028ex; height:2.176ex;" alt="{\displaystyle M=201}" loading="lazy"></span> and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle N=1024,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>N</mi>
<mo>=</mo>
<mn>1024</mn>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle N=1024,}</annotation>
</semantics>
</math></span><img src="./6726a953a70c376f15978b353ae976c23e0937e9.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:10.459ex; height:2.509ex;" alt="{\displaystyle N=1024,}" loading="lazy"></span> <b><a href="#math_Eq.3">Eq.3</a></b> equals <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 13.67,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mn>13.67</mn>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 13.67,}</annotation>
</semantics>
</math></span><img src="./0e842cb8e9b005740aa5e0b2dbb963a588c43538.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:5.944ex; height:2.509ex;" alt="{\displaystyle 13.67,}" loading="lazy"></span> whereas direct evaluation of <b><a href="#math_Eq.1">Eq.1</a></b> would require up to <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle 201}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mn>201</mn>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle 201}</annotation>
</semantics>
</math></span><img src="./278d5f2c7e980de648903c802691b67116dced05.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:3.487ex; height:2.176ex;" alt="{\displaystyle 201}" loading="lazy"></span> complex multiplications per output sample, the worst case being when both <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle x}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>x</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle x}</annotation>
</semantics>
</math></span><img src="./87f9e315fd7e2ba406057a97300593c4802b53e4.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.33ex; height:1.676ex;" alt="{\displaystyle x}" loading="lazy"></span> and <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle h}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>h</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle h}</annotation>
</semantics>
</math></span><img src="./b26be3e694314bc90c3215047e4a2010c6ee184a.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:1.339ex; height:2.176ex;" alt="{\displaystyle h}" loading="lazy"></span> are complex-valued. Also note that for any given <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M,}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>M</mi>
<mo>,</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M,}</annotation>
</semantics>
</math></span><img src="./b466e90209f39c0c2caad1b11445824b82c2f536.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:3.089ex; height:2.509ex;" alt="{\displaystyle M,}" loading="lazy"></span> <b><a href="#math_Eq.3">Eq.3</a></b> has a minimum with respect to <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle N.}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>N</mi>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle N.}</annotation>
</semantics>
</math></span><img src="./356b8b60a047de347b447f2bdafaaccf47502031.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:2.71ex; height:2.176ex;" alt="{\displaystyle N.}" loading="lazy"></span> Figure 2 is a graph of the values of <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle N}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>N</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle N}</annotation>
</semantics>
</math></span><img src="./f5e3890c981ae85503089652feb48b191b57aae3.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:2.064ex; height:2.176ex;" alt="{\displaystyle N}" loading="lazy"></span> that minimize <b><a href="#math_Eq.3">Eq.3</a></b> for a range of filter lengths (<span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle M}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>M</mi>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle M}</annotation>
</semantics>
</math></span><img src="./f82cade9898ced02fdd08712e5f0c0151758a0dd.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.338ex; width:2.442ex; height:2.176ex;" alt="{\displaystyle M}" loading="lazy"></span>).
</p><p>Instead of <b><a href="#math_Eq.1">Eq.1</a></b>, we can also consider applying <b><a href="#math_Eq.2">Eq.2</a></b> to a long sequence of length <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle N_{x}}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>N</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>x</mi>
</mrow>
</msub>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle N_{x}}</annotation>
</semantics>
</math></span><img src="./c1eb9520e339a292309b68edc1466f4e90113ddf.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.671ex; width:3.039ex; height:2.509ex;" alt="{\displaystyle N_{x}}" loading="lazy"></span> samples. The total number of complex multiplications would be:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle N_{x}\cdot (\log _{2}(N_{x})+1).}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>N</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>x</mi>
</mrow>
</msub>
<mo>⋅<!-- ⋅ --></mo>
<mo stretchy="false">(</mo>
<msub>
<mi>log</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<msub>
<mi>N</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>x</mi>
</mrow>
</msub>
<mo stretchy="false">)</mo>
<mo>+</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle N_{x}\cdot (\log _{2}(N_{x})+1).}</annotation>
</semantics>
</math></span><img src="./01cf7d19cf2f40bdf8695dd6665573b8507aa7a0.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:20.051ex; height:2.843ex;" alt="{\displaystyle N_{x}\cdot (\log _{2}(N_{x})+1).}" loading="lazy"></span></dd></dl>
<p>Comparatively, the number of complex multiplications required by the pseudocode algorithm is:
</p>
<dl><dd><span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle N_{x}\cdot (\log _{2}(N)+1)\cdot {\frac {N}{N-M+1}}.}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<msub>
<mi>N</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>x</mi>
</mrow>
</msub>
<mo>⋅<!-- ⋅ --></mo>
<mo stretchy="false">(</mo>
<msub>
<mi>log</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
<mo>⁡<!-- ⁡ --></mo>
<mo stretchy="false">(</mo>
<mi>N</mi>
<mo stretchy="false">)</mo>
<mo>+</mo>
<mn>1</mn>
<mo stretchy="false">)</mo>
<mo>⋅<!-- ⋅ --></mo>
<mrow class="MJX-TeXAtom-ORD">
<mfrac>
<mi>N</mi>
<mrow>
<mi>N</mi>
<mo>−<!-- − --></mo>
<mi>M</mi>
<mo>+</mo>
<mn>1</mn>
</mrow>
</mfrac>
</mrow>
<mo>.</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle N_{x}\cdot (\log _{2}(N)+1)\cdot {\frac {N}{N-M+1}}.}</annotation>
</semantics>
</math></span><img src="./49d6dbf38cf993cdffa7c90309cdf2ce09dc94d3.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -2.005ex; width:32.94ex; height:5.343ex;" alt="{\displaystyle N_{x}\cdot (\log _{2}(N)+1)\cdot {\frac {N}{N-M+1}}.}" loading="lazy"></span></dd></dl>
<p>Hence the <i>cost</i> of the overlap–save method scales almost as <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle O\left(N_{x}\log _{2}N\right)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>O</mi>
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>N</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>x</mi>
</mrow>
</msub>
<msub>
<mi>log</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
<mo>⁡<!-- ⁡ --></mo>
<mi>N</mi>
</mrow>
<mo>)</mo>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle O\left(N_{x}\log _{2}N\right)}</annotation>
</semantics>
</math></span><img src="./ad984eaa7ac7c1a0d3a90d6ffb33a54b6d436533.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:13.872ex; height:2.843ex;" alt="{\displaystyle O\left(N_{x}\log _{2}N\right)}" loading="lazy"></span> while the cost of a single, large circular convolution is almost <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle O\left(N_{x}\log _{2}N_{x}\right)}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>O</mi>
<mrow>
<mo>(</mo>
<mrow>
<msub>
<mi>N</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>x</mi>
</mrow>
</msub>
<msub>
<mi>log</mi>
<mrow class="MJX-TeXAtom-ORD">
<mn>2</mn>
</mrow>
</msub>
<mo>⁡<!-- ⁡ --></mo>
<msub>
<mi>N</mi>
<mrow class="MJX-TeXAtom-ORD">
<mi>x</mi>
</mrow>
</msub>
</mrow>
<mo>)</mo>
</mrow>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle O\left(N_{x}\log _{2}N_{x}\right)}</annotation>
</semantics>
</math></span><img src="./7059fd526359ba05edfa9289f3faf83b778a4a7c.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:14.847ex; height:2.843ex;" alt="{\displaystyle O\left(N_{x}\log _{2}N_{x}\right)}" loading="lazy"></span>.
</p>
<div class="mw-heading mw-heading2"><h2 id="Overlap–discard">Overlap–discard</h2></div>
<p><i>Overlap–discard</i><sup id="cite_ref-f.harris_7-0" class="reference"><a href="#cite_note-f.harris-7"><span class="cite-bracket">[</span>2<span class="cite-bracket">]</span></a></sup> and <i>Overlap–scrap</i><sup id="cite_ref-Frerking_8-0" class="reference"><a href="#cite_note-Frerking-8"><span class="cite-bracket">[</span>3<span class="cite-bracket">]</span></a></sup> are less commonly used labels for the same method described here. However, these labels are actually better (than <i>overlap–save</i>) to distinguish from <a href="Overlap%E2%80%93add_method" title="Overlap–add method">overlap–add</a>, because <u>both</u> methods "save", but only one discards. "Save" merely refers to the fact that <i>M</i>&nbsp;−&nbsp;1 input (or output) samples from segment <i>k</i> are needed to process segment <i>k</i> + 1.
</p>
<div class="mw-heading mw-heading3"><h3 id="Extending_overlap–save">Extending overlap–save</h3></div>
<p>The overlap–save algorithm can be extended to include other common operations of a system:<sup id="cite_ref-9" class="reference"><a href="#cite_note-9"><span class="cite-bracket">[</span>F<span class="cite-bracket">]</span></a></sup><sup id="cite_ref-Borgerding_10-0" class="reference"><a href="#cite_note-Borgerding-10"><span class="cite-bracket">[</span>4<span class="cite-bracket">]</span></a></sup>
</p>
<ul><li>additional IFFT channels can be processed more cheaply than the first by reusing the forward FFT</li>
<li>sampling rates can be changed by using different sized forward and inverse FFTs</li>
<li>frequency translation (mixing) can be accomplished by rearranging frequency bins</li></ul>
<div class="mw-heading mw-heading2"><h2 id="See_also">See also</h2></div>
<ul><li><a href="Overlap%E2%80%93add_method" title="Overlap–add method">Overlap–add method</a></li>
<li><a href="Circular_convolution#Example" title="Circular convolution">Circular convolution#Example</a></li></ul>
<div class="mw-heading mw-heading2"><h2 id="Notes">Notes</h2></div>
<style data-mw-deduplicate="TemplateStyles:r1239543626">
/* start https://en.wikipedia.org/ */


.mw-parser-output .reflist{margin-bottom:0.5em;list-style-type:decimal}@media screen{.mw-parser-output .reflist{font-size:90%}}.mw-parser-output .reflist .references{font-size:100%;margin-bottom:0;list-style-type:inherit}.mw-parser-output .reflist-columns-2{column-width:30em}.mw-parser-output .reflist-columns-3{column-width:25em}.mw-parser-output .reflist-columns{margin-top:0.3em}.mw-parser-output .reflist-columns ol{margin-top:0}.mw-parser-output .reflist-columns li{page-break-inside:avoid;break-inside:avoid-column}.mw-parser-output .reflist-upper-alpha{list-style-type:upper-alpha}.mw-parser-output .reflist-upper-roman{list-style-type:upper-roman}.mw-parser-output .reflist-lower-alpha{list-style-type:lower-alpha}.mw-parser-output .reflist-lower-greek{list-style-type:lower-greek}.mw-parser-output .reflist-lower-roman{list-style-type:lower-roman}


/* end https://en.wikipedia.org/ */
</style><div class="reflist reflist-upper-alpha">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-1"><span class="mw-cite-backlink"><b><a href="#cite_ref-1">^</a></b></span> <span class="reference-text"><a href="#refRabiner">Rabiner and Gold</a>, Fig 2.35, fourth trace.</span>
</li>
<li id="cite_note-3"><span class="mw-cite-backlink"><b><a href="#cite_ref-3">^</a></b></span> <span class="reference-text">Shifting the undesirable edge effects to the last M-1 outputs is a potential run-time convenience, because the IDFT can be computed in the <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle y[n]}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mi>y</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle y[n]}</annotation>
</semantics>
</math></span><img src="./305428e6d1fb59cd0163a7a96ace52292a262afa.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:3.844ex; height:2.843ex;" alt="{\displaystyle y[n]}" loading="lazy"></span> buffer, instead of being computed and copied. Then the edge effects can be overwritten by the next IDFT.&nbsp; A subsequent footnote explains how the shift is done, by a time-shift of the impulse response.</span>
</li>
<li id="cite_note-4"><span class="mw-cite-backlink"><b><a href="#cite_ref-4">^</a></b></span> <span class="reference-text">Not to be confused with the <a href="Overlap-add_method" class="mw-redirect" title="Overlap-add method">Overlap-add method</a>, which preserves separate leading and trailing edge-effects.</span>
</li>
<li id="cite_note-5"><span class="mw-cite-backlink"><b><a href="#cite_ref-5">^</a></b></span> <span class="reference-text">The edge effects can be moved from the front to the back of the IDFT output by replacing <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n])}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mstyle displaystyle="false" scriptlevel="1">
<msub>
<mrow class="MJX-TeXAtom-ORD">
<mtext>DFT</mtext>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo stretchy="false">]</mo>
<mo stretchy="false">)</mo>
</mstyle>
</mstyle>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n])}</annotation>
</semantics>
</math></span><img src="./c8b62f1e3076cbb889d1f75935625152f54260c7.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:10.701ex; height:2.843ex;" alt="{\displaystyle \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n])}" loading="lazy"></span> with <span class="mwe-math-element mwe-math-element-inline"><span class="mwe-math-mathml-inline mwe-math-mathml-a11y" style="display: none;"><math xmlns="http://www.w3.org/1998/Math/MathML" alttext="{\displaystyle \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n+M-1])=\ \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n+M-1-N]),}">
<semantics>
<mrow class="MJX-TeXAtom-ORD">
<mstyle displaystyle="true" scriptlevel="0">
<mstyle displaystyle="false" scriptlevel="1">
<msub>
<mrow class="MJX-TeXAtom-ORD">
<mtext>DFT</mtext>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>+</mo>
<mi>M</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo stretchy="false">]</mo>
<mo stretchy="false">)</mo>
<mo>=</mo>
<mtext>&nbsp;</mtext>
<mstyle displaystyle="false" scriptlevel="1">
<msub>
<mrow class="MJX-TeXAtom-ORD">
<mtext>DFT</mtext>
</mrow>
<mrow class="MJX-TeXAtom-ORD">
<mi>N</mi>
</mrow>
</msub>
<mstyle displaystyle="true" scriptlevel="0">
<mo stretchy="false">(</mo>
<mi>h</mi>
<mo stretchy="false">[</mo>
<mi>n</mi>
<mo>+</mo>
<mi>M</mi>
<mo>−<!-- − --></mo>
<mn>1</mn>
<mo>−<!-- − --></mo>
<mi>N</mi>
<mo stretchy="false">]</mo>
<mo stretchy="false">)</mo>
<mo>,</mo>
</mstyle>
</mstyle>
</mstyle>
</mstyle>
</mstyle>
</mrow>
<annotation encoding="application/x-tex">{\displaystyle \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n+M-1])=\ \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n+M-1-N]),}</annotation>
</semantics>
</math></span><img src="./4d183616f0965f41fa1094f723772164c57bc814.svg" class="mwe-math-fallback-image-inline mw-invert skin-invert" aria-hidden="true" style="vertical-align: -0.838ex; width:49.203ex; height:2.843ex;" alt="{\displaystyle \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n+M-1])=\ \scriptstyle {\text{DFT}}_{N}\displaystyle (h[n+M-1-N]),}" loading="lazy"></span> meaning that the N-length buffer is <i>circularly-shifted</i> (rotated) by M-1 samples. Thus the h(M) element is at n=1. The h(M-1) element is at n=N. h(M-2) is at n=N-1. Etc.</span>
</li>
<li id="cite_note-6"><span class="mw-cite-backlink"><b><a href="#cite_ref-6">^</a></b></span> <span class="reference-text">Cooley–Tukey FFT algorithm for N=2<sup>k</sup> needs (N/2) log<sub>2</sub>(N) – see <a href="Fast_Fourier_transform#Definition" title="Fast Fourier transform">FFT – Definition and speed</a></span>
</li>
<li id="cite_note-9"><span class="mw-cite-backlink"><b><a href="#cite_ref-9">^</a></b></span> <span class="reference-text"><a href="#refCarlin">Carlin et al. 1999</a>, p 31, col 20.</span>
</li>
</ol></div></div>
<div class="mw-heading mw-heading2"><h2 id="References">References</h2></div>
<div class="reflist">
<div class="mw-references-wrap"><ol class="references">
<li id="cite_note-OLA-2"><span class="mw-cite-backlink"><b><a href="#cite_ref-OLA_2-0">^</a></b></span> <span class="reference-text">
<style data-mw-deduplicate="TemplateStyles:r1238218222">
/* start https://en.wikipedia.org/ */


.mw-parser-output cite.citation{font-style:inherit;word-wrap:break-word}.mw-parser-output .citation q{quotes:"\"""\"""'""'"}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}.mw-parser-output .id-lock-free.id-lock-free a{background:url("./mw/Lock-green.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-limited.id-lock-limited a,.mw-parser-output .id-lock-registration.id-lock-registration a{background:url("./mw/Lock-gray-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .id-lock-subscription.id-lock-subscription a{background:url("./mw/Lock-red-alt-2.svg")right 0.1em center/9px no-repeat}.mw-parser-output .cs1-ws-icon a{background:url("./mw/Wikisource-logo.svg")right 0.1em center/12px no-repeat}body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-free a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-limited a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-registration a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .id-lock-subscription a,body:not(.skin-timeless):not(.skin-minerva) .mw-parser-output .cs1-ws-icon a{background-size:contain;padding:0 1em 0 0}.mw-parser-output .cs1-code{color:inherit;background:inherit;border:none;padding:inherit}.mw-parser-output .cs1-hidden-error{display:none;color:var(--color-error,#d33)}.mw-parser-output .cs1-visible-error{color:var(--color-error,#d33)}.mw-parser-output .cs1-maint{display:none;color:#085;margin-left:0.3em}.mw-parser-output .cs1-kern-left{padding-left:0.2em}.mw-parser-output .cs1-kern-right{padding-right:0.2em}.mw-parser-output .citation .mw-selflink{font-weight:inherit}@media screen{.mw-parser-output .cs1-format{font-size:95%}html.skin-theme-clientpref-night .mw-parser-output .cs1-maint{color:#18911f}}@media screen and (prefers-color-scheme:dark){html.skin-theme-clientpref-os .mw-parser-output .cs1-maint{color:#18911f}}


/* end https://en.wikipedia.org/ */
</style><cite class="citation web cs1"><a rel="nofollow" class="external text" href="https://www.dsprelated.com/freebooks/sasp/Overlap_Add_OLA_STFT_Processing.html">"Overlap-Add (OLA) STFT Processing | Spectral Audio Signal Processing"</a>. <i>www.dsprelated.com</i><span class="reference-accessdate">. Retrieved <span class="nowrap">2024-03-02</span></span>. <q>The name overlap-save comes from the fact that L-1 samples of the previous frame [here: M-1 samples of the current frame] are saved for computing the next frame.</q></cite></span>
</li>
<li id="cite_note-f.harris-7"><span class="mw-cite-backlink"><b><a href="#cite_ref-f.harris_7-0">^</a></b></span> <span class="reference-text">
<cite id="CITEREFHarris,_F.J.1987" class="citation book cs1">Harris, F.J. (1987). D.F.Elliot (ed.). <i>Handbook of Digital Signal Processing</i>. San Diego: Academic Press. pp.&nbsp;<span class="nowrap">633–</span>699. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>0122370759</bdi>.</cite></span>
</li>
<li id="cite_note-Frerking-8"><span class="mw-cite-backlink"><b><a href="#cite_ref-Frerking_8-0">^</a></b></span> <span class="reference-text">
<cite id="CITEREFFrerking,_Marvin1994" class="citation book cs1">Frerking, Marvin (1994). <i>Digital Signal Processing in Communication Systems</i>. New York: Van Nostrand Reinhold. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>0442016166</bdi>.</cite></span>
</li>
<li id="cite_note-Borgerding-10"><span class="mw-cite-backlink"><b><a href="#cite_ref-Borgerding_10-0">^</a></b></span> <span class="reference-text">
<cite id="CITEREFBorgerding2006" class="citation journal cs1">Borgerding, Mark (2006). <span class="id-lock-subscription" title="Paid subscription required"><a rel="nofollow" class="external text" href="https://ieeexplore.ieee.org/document/1598092">"Turning Overlap–Save into a Multiband Mixing, Downsampling Filter Bank"</a></span>. <i>IEEE Signal Processing Magazine</i>. <b>23</b> (March 2006): <span class="nowrap">158–</span>161. <a href="Doi_(identifier)" class="mw-redirect" title="Doi (identifier)">doi</a>:<a rel="nofollow" class="external text" href="https://doi.org/10.1109%2FMSP.2006.1598092">10.1109/MSP.2006.1598092</a>.</cite></span>
</li>
</ol></div></div>
<style data-mw-deduplicate="TemplateStyles:r1239549316">
/* start https://en.wikipedia.org/ */


.mw-parser-output .refbegin{margin-bottom:0.5em}.mw-parser-output .refbegin-hanging-indents>ul{margin-left:0}.mw-parser-output .refbegin-hanging-indents>ul>li{margin-left:0;padding-left:3.2em;text-indent:-3.2em}.mw-parser-output .refbegin-hanging-indents ul,.mw-parser-output .refbegin-hanging-indents ul li{list-style:none}@media(max-width:720px){.mw-parser-output .refbegin-hanging-indents>ul>li{padding-left:1.6em;text-indent:-1.6em}}.mw-parser-output .refbegin-columns{margin-top:0.3em}.mw-parser-output .refbegin-columns ul{margin-top:0}.mw-parser-output .refbegin-columns li{page-break-inside:avoid;break-inside:avoid-column}@media screen{.mw-parser-output .refbegin{font-size:90%}}


/* end https://en.wikipedia.org/ */
</style><div class="refbegin" style="">
<ol><li value="4"><cite id="refRabiner" class="citation book cs1">Rabiner, Lawrence R.; Gold, Bernard (1975). <span class="id-lock-registration" title="Free registration required"><a rel="nofollow" class="external text" href="https://archive.org/details/theoryapplicatio00rabi/page/67">"2.25"</a></span>. <i>Theory and application of digital signal processing</i>. Englewood Cliffs, N.J.: Prentice-Hall. pp.&nbsp;<a rel="nofollow" class="external text" href="https://archive.org/details/theoryapplicatio00rabi/page/63">63–67</a>. <a href="ISBN_(identifier)" class="mw-redirect" title="ISBN (identifier)">ISBN</a>&nbsp;<bdi>0-13-914101-4</bdi>.</cite></li>
<li><style data-mw-deduplicate="TemplateStyles:r1041539562">
/* start https://en.wikipedia.org/ */


.mw-parser-output .citation{word-wrap:break-word}.mw-parser-output .citation:target{background-color:rgba(0,127,255,0.133)}


/* end https://en.wikipedia.org/ */
</style><span class="citation patent" id="refCarlin"><a rel="nofollow" class="external text" href="https://worldwide.espacenet.com/textdoc?DB=EPODOC&amp;IDX=US6898235">US patent 6898235</a>, Carlin, Joe; Collins, Terry &amp; Hays, Peter et al., "Wideband communication intercept and direction finding device using hyperchannelization", published 1999-12-10, issued 2005-05-24</span><span class="Z3988" title="ctx_ver=Z39.88-2004&amp;rft_val_fmt=info%3Aofi%2Ffmt%3Akev%3Amtx%3Apatent&amp;rft.number=6898235&amp;rft.cc=US&amp;rft.title=Wideband+communication+intercept+and+direction+finding+device+using+hyperchannelization&amp;rft.inventor=Carlin%2C+Joe&amp;rft.date=2005-05-24&amp;rft.appldate=1999-12-10&amp;rft.pubdate=1999-12-10"><span style="display: none;">&nbsp;</span></span>, also available at <a rel="nofollow" class="external free" href="https://patentimages.storage.googleapis.com/4d/39/2a/cec2ae6f33c1e7/US6898235.pdf">https://patentimages.storage.googleapis.com/4d/39/2a/cec2ae6f33c1e7/US6898235.pdf</a></li></ol>
</div>
<div class="mw-heading mw-heading2"><h2 id="External_links">External links</h2></div>
<ul><li>Dr. Deepa Kundur, <a rel="nofollow" class="external text" href="https://www.comm.utoronto.ca/~dkundur/course_info/real-time-DSP/notes/8_Kundur_Overlap_Save_Add.pdf">Overlap Add and Overlap Save</a>, University of Toronto</li></ul></div><!--htdig_noindex--><div><div class="zim-footer">
This article is issued from <a class="external text" title="Last edited on 2025-05-26" href="https://en.wikipedia.org/wiki/?title=Overlap%E2%80%93save_method&amp;oldid=1292286621">Wikipedia</a>. The text is available under <a class="external text" href="https://creativecommons.org/licenses/by-sa/4.0/deed.en">Creative Commons Attribution-Share Alike 4.0</a> unless otherwise noted. Additional terms may apply for the media files.
</div>
</div><!--/htdig_noindex--></div>
</div>
</main>
</div>
</div>
</div>

</body></html>